CREATE OR REPLACE FUNCTION ustaw_czas_poczatkowy_awarii() RETURNS trigger AS $ustaw_czas_poczatkowy_awarii$
    BEGIN
        IF NEW.od < current_timestamp THEN
            NEW.od = current_timestamp;
        END IF;
        IF NEW.do IS NOT NULL AND NEW.do <= current_timestamp THEN
            NEW.do = current_timestamp + INTERVAL '1 MINUTE';
        END IF;    
        RETURN NEW;
    END;
$ustaw_czas_poczatkowy_awarii$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS ustaw_czas_poczatkowy_awarii ON kinorezerwacja_awaria CASCADE;
CREATE TRIGGER ustaw_czas_poczatkowy_awarii BEFORE INSERT ON kinorezerwacja_awaria
    FOR EACH ROW EXECUTE PROCEDURE ustaw_czas_poczatkowy_awarii();
    
CREATE OR REPLACE FUNCTION ustaw_czas_awarii_zmiana() RETURNS trigger AS $ustaw_czas_awarii_zmiana$
    BEGIN
        NEW.od = NEW.do;
        IF OLD.do IS NOT NULL THEN
            NEW.do = OLD.do;
        END IF;    
        RETURN NEW;
    END;
$ustaw_czas_awarii_zmiana$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS ustaw_czas_awarii_zmiana ON kinorezerwacja_awaria CASCADE;
CREATE TRIGGER ustaw_czas_awarii_zmiana BEFORE UPDATE ON kinorezerwacja_awaria
    FOR EACH ROW EXECUTE PROCEDURE ustaw_czas_awarii_zmiana();    
    
    
CREATE OR REPLACE FUNCTION ustaw_nowy_stan(id_im integer)
    RETURNS void AS
$$ BEGIN
     
    UPDATE kinorezerwacja_instancja_miejsca SET stan = 'wolny'
        WHERE id = id_im
        AND (czy_jest_na_to_rezerwacja(id) = FALSE)
        AND (sprawdz_czy_cos_uleglo_awarii(
        czas_rozpoczecia(id_seansu), 
        czas_rozpoczecia(id_seansu) + (czas_trwania(pobierz_id_filmu(id_seansu)) * INTERVAL '1 MINUTE'),
        id_miejsca, 'miejsca') = FALSE)
        AND (sprawdz_czy_cos_uleglo_awarii(
        czas_rozpoczecia(id_seansu), 
        czas_rozpoczecia(id_seansu) + (czas_trwania(pobierz_id_filmu(id_seansu)) * INTERVAL '1 MINUTE'),
        pobierz_id_sali(id_miejsca), 'sali') = FALSE)
        ;
    UPDATE kinorezerwacja_instancja_miejsca SET stan = 'zarezerwowany'
        WHERE id = id_im
        AND (czy_jest_na_to_rezerwacja(id) = TRUE)
        AND (sprawdz_czy_cos_uleglo_awarii(
        czas_rozpoczecia(id_seansu), 
        czas_rozpoczecia(id_seansu) + (czas_trwania(pobierz_id_filmu(id_seansu)) * INTERVAL '1 MINUTE'),
        id_miejsca, 'miejsca') = FALSE)
        AND (sprawdz_czy_cos_uleglo_awarii(
        czas_rozpoczecia(id_seansu), 
        czas_rozpoczecia(id_seansu) + (czas_trwania(pobierz_id_filmu(id_seansu)) * INTERVAL '1 MINUTE'),
        pobierz_id_sali(id_miejsca), 'sali') = FALSE)
        ;
    UPDATE kinorezerwacja_instancja_miejsca SET stan = 'niedostepny'
        WHERE id = id_im
        AND 
        (
        sprawdz_czy_cos_uleglo_awarii(
        czas_rozpoczecia(id_seansu), 
        czas_rozpoczecia(id_seansu) + (czas_trwania(pobierz_id_filmu(id_seansu)) * INTERVAL '1 MINUTE'),
        id_miejsca, 'miejsca')
        OR sprawdz_czy_cos_uleglo_awarii(
        czas_rozpoczecia(id_seansu), 
        czas_rozpoczecia(id_seansu) + (czas_trwania(pobierz_id_filmu(id_seansu)) * INTERVAL '1 MINUTE'),
        pobierz_id_sali(id_miejsca), 'sali')
        );        
    RETURN;
END; $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION ustaw_nowy_stan_instancji_miejsca() RETURNS trigger AS $ustaw_nowy_stan_instancji_miejsca$
    BEGIN
        PERFORM ustaw_nowy_stan(OLD.id_instancji_miejsca);
        RETURN OLD;
    END;
$ustaw_nowy_stan_instancji_miejsca$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION ustaw_nowy_stan_instancji_miejsca_po_awari() RETURNS trigger AS $ustaw_nowy_stan_instancji_miejsca_po_awari$
    DECLARE 
        r kinorezerwacja_instancja_miejsca%rowtype;
    BEGIN
        for r in (
            SELECT * FROM kinorezerwacja_instancja_miejsca 
        ) LOOP
            PERFORM ustaw_nowy_stan(r.id);
        END LOOP;
        RETURN OLD;
    END;
$ustaw_nowy_stan_instancji_miejsca_po_awari$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS ustaw_nowy_stan_instancji_miejsca ON kinorezerwacja_rezerwacja CASCADE;
DROP TRIGGER IF EXISTS ustaw_nowy_stan_instancji_miejsca_po_awarii ON kinorezerwacja_awaria CASCADE;
CREATE TRIGGER ustaw_nowy_stan_instancji_miejsca AFTER DELETE ON kinorezerwacja_rezerwacja
    FOR EACH ROW EXECUTE PROCEDURE ustaw_nowy_stan_instancji_miejsca();
CREATE TRIGGER ustaw_nowy_stan_instancji_miejsca_po_awarii AFTER UPDATE ON kinorezerwacja_awaria
    FOR EACH ROW EXECUTE PROCEDURE ustaw_nowy_stan_instancji_miejsca_po_awari();
    
    
CREATE OR REPLACE FUNCTION zaniechaj_zmiany_czasu_trwania_filmu() RETURNS trigger AS $zaniechaj_zmiany_czasu_trwania_filmu$
    BEGIN
        NEW.czas_trwania = OLD.czas_trwania;
        RETURN NEW;
    END;
$zaniechaj_zmiany_czasu_trwania_filmu$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS zaniechaj_zmiany_czasu_trwania_filmu ON kinorezerwacja_film CASCADE;
CREATE TRIGGER zaniechaj_zmiany_czasu_trwania_filmu BEFORE UPDATE ON kinorezerwacja_film
    FOR EACH ROW EXECUTE PROCEDURE zaniechaj_zmiany_czasu_trwania_filmu();
        
    
